/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import controller.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author Kelompok 7
 * Kelas ini berisi method-method query.
 * Method ini digunakan untuk mengoperasikan database.
 * Kelas ini terintegrasi dengan tabel event.
 * Sehingga kelas ini mampu memanggil attribut dari entitas yang ada.
 */
public class DaftarEvent {
    
    //Menghubungkan dengan database sesuai dengan persistence

    public DaftarEvent() {
        emf = Persistence.createEntityManagerFactory("persistence");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    
    //Method berikut digunakan untuk melakukan pengecekan satu baris
    //dalam tabel menggunakan "judul event"
    
    public boolean check(String judulEvent) {
        boolean result = false;
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("SELECT count(o) FROM Event AS o WHERE o.judulEvent=:evn");
            q.setParameter("evn", judulEvent);
            int jumlahEvent = ((Long) q.getSingleResult()).intValue();
            if (jumlahEvent > 0) {
                result = true;
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
        return result;
    }

    //Method berikut ini digunakan untuk mengambil seluruh 
    //event yang ada dalam tabel
    
    public List<Event> getEvents() {
        List<Event> Events = new ArrayList<Event>();

        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("SELECT object(o) FROM Event AS o");
            Events = q.getResultList();

        } finally {
            if (em != null) {
                em.close();
            }
        }
        return Events;
    }

    //Method ini digunakan untuk memasukkan satu baris data baru dalam tabel
    
    public void create(Event Event) {
        EntityManager em = getEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(Event);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    //Method ini digunakan untuk merubah nilai attribut dalam entitas
    
    public void editEvent(Event Event) {
        EntityManager em = getEntityManager();
        em.getTransaction().begin();
        try {
            em.merge(Event);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    //Method ini digunakan untuk melihat satu baris attribut dalam tabel
    //event dengan menggunakan idEvent
    
    public Event getEvent(Long idEvent) {
        Event Event = null;
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("SELECT object(o) FROM Event AS o WHERE o.idEvent=:ie");
            q.setParameter("ie", idEvent);
            Event = (Event) q.getSingleResult();
        } finally {
            if (em != null) {
                em.close();
            }
        }
        return Event;
    }

    //Method ini digunakan untuk menghapus satu baris attribut dalam entitas
    //event menggunakan idEvent
    
    public void deleteEvent(Long idEvent) throws NonexistentEntityException {
        EntityManager em = getEntityManager();
        em.getTransaction().begin();
        try {
            Event event;
            try {
                event = em.getReference(Event.class, idEvent);
                event.getIdEvent();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The user with idEvent " + idEvent + " no longer exists.", enfe);
            }
            em.remove(event);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
}
